package com.lanchetech.admin.service;

import com.lanchetech.bean.request.*;
import com.lanchetech.bean.response.*;
import com.lanchetech.bean.vo.*;
import com.lanchetech.common.exception.ResultCodeException;
import com.lanchetech.entity.*;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.List;

public interface UserService {

    ResultData<UserDetailResp> getUserDetail(Long id);

    BaseResp modifyUserInfo(UserInfo userInfo);

    BaseResp blockUser(Long id, Integer status);

    ResultData<BasePageResp<User>> getUserPage(PageReq req);

    BaseResp createUserPrivilege(Privilege privilege);

    BaseResp deleteUserPrivilege(Long id);


    ResultData<BasePageResp<WithdrawResp>> getWithdrawPage(WithdrawReq req);

    void exportWithdrawExcel(WithdrawReq req, HttpServletResponse response) throws IOException;

    BaseResp checkWithdraw(Withdraw withdraw);

    ResultData<BasePageResp<RelationshipResp>> getUserRelationshipPage(RelationshipReq req);

    void exportUserExcel(PageReq req, HttpServletResponse response) throws IOException;

    ResultData<BasePageResp<UserCommissionResp>> getUserCommissionPage(UserCommissionReq req);

    BaseResp issueConsumeCommission(UserCommission userCommission);

    BaseResp cancelCommission(Long id);

    ResultData<BasePageResp<BalanceFlowVO>> getBalanceFlowPage(PageReq req);

    BaseResp createUserRelationship(Long userId, String phone);

    BaseResp lockUserRelationship(Long userId);

    ResultData<BasePageResp<UserGroupVO>> getUserGroupPage(UserGroupReq req);

    BaseResp deleteUserGroup(Long id);

    BaseResp changeCaptain(Long id, Long captainId);

    ResultData<TransferUserGroupVO> transferCaptain(Long oldCaptainId, Long newCaptainId);

    BaseResp updateCardPoint(Long userId, BigDecimal amount);

    BaseResp editShopApply(ShopApply shopApply);

    ResultData<BasePageResp<ShopApplyVO>> getShopApplyPage(PageReq req);

    BaseResp deleteShopApply(Long id);

    BaseResp auditShopApply(ShopApply req);

    BaseResp getInformationPage(PageReq req);

    BaseResp updateAdPoint(Long userId, BigDecimal amount, Byte tradeType);

    BaseResp editUserAgentLevel(UserAgentLevel req);

    BaseResp cancelUserAgentLevel(Long id);

    ResultData<BasePageResp<UserAgentLevelVO>> getUserAgentLevelPage(PageReq req);

    void rankReward(Byte type);

    ResultData<BasePageResp<TicketVO>> getTicketPage(TicketPageReq req);

    BaseResp editTicket(Ticket req);

    BaseResp createUserLevelTicket(VipReq req);

    ResultData<TicketVO> getTicketDetail(Long id);

    BaseResp deleteTicket(Long id);

    BaseResp firstAuditTicket(Ticket req);

    BaseResp secondAuditTicket(Ticket req);

    ResultData<BasePageResp<AreaApplyVO>> getAreaApplyPage(AreaApplyPageReq req);

    BaseResp auditAreaApply(AreaApply req);

    ResultData<AreaApplyVO> getAreaApplyDetail(Long id);

    ResultData<BasePageResp<SuggestionVO>> getSuggestionPage(PageReq req);

    BaseResp updateUserStaffType(Long id, Byte staffType);

    ResultData<List<LongCountByDateVO>> getRegisterUserCount(CountByTimeReq req);

    BaseResp getGiveIdentityRecordPage(GiveIdentityRecordPageReq req);

    ResultData<List<BankAccount>> getUserBankAccount(Long userId);

    BaseResp editBankAccount(BankAccount bankAccount);

    ResultData<MsgUser> getMsgUserDetail(Long userId);

    ResultData<BasePageResp<GroupsPerformanceVO>> getGroupsPerformancePage(GroupsPerformancePageReq req);

    ResultData<BasePageResp<ShareholderPerformanceVO>> getShareholderPerformancePage(ShareholderPerformancePageReq req);

    ResultData<BasePageResp<WelfareFlowVO>> getWelfareFlowPage(WelfareFlowPageReq req);

    ResultData<BasePageResp<UserCelebrityVo>> celebrityList(UserCelebrityReq req);

    void celebrityExamine(UserCelebrity userCelebrity) throws ResultCodeException;
}